/* 
 * File:   sysfun.c
 * Author: apleilx
 *
 * Created on 2015年9月3日, 上午9:59
 */

#include "stri.h"
#include "stri_simulink.h"
#include "math.h"
#include "physics.h"

sim_type sim_obj;

void simulink_run(void)
{
    float neng_liang_nei_to_obj = 0, neng_liang_wai_to_nei = 0, neng_linag_wai_leave = 0;
	
	// 加热器注入能量滞后
    sim_obj.heat.main_duty_flt += (sim_obj.heat.main_heat_duty - sim_obj.heat.main_duty_flt) * 0.025;
    sim_obj.heat.ext_duty_flt += (sim_obj.heat.ext_heat_duty - sim_obj.heat.ext_duty_flt) * 0.025;
    
	// 内加热能量注入
	sim_obj.neng_liang.nei += sim_obj.heat.main_duty_flt * 800 / sim_obj.heat.main_heat_period;
	
	// 物温与内部热交换
	if( sim_obj.temp.f_nei > sim_obj.temp.f_obj )
	{
		neng_liang_nei_to_obj = pow((sim_obj.temp.f_nei - sim_obj.temp.f_obj), 1.8) * 0.625;
	}
	else if(sim_obj.temp.f_nei < sim_obj.temp.f_obj )
	{
		neng_liang_nei_to_obj = -pow((sim_obj.temp.f_obj - sim_obj.temp.f_nei), 1.8) * 0.625;
	}
	
	// 内部与外壁热交换
	if( sim_obj.temp.f_wai > sim_obj.temp.f_nei )
	{
		neng_liang_wai_to_nei = pow((sim_obj.temp.f_wai - sim_obj.temp.f_nei), 2) * 0.375;
	}
	else if( sim_obj.temp.f_wai < sim_obj.temp.f_nei )
	{
		neng_liang_wai_to_nei = -pow((sim_obj.temp.f_nei - sim_obj.temp.f_wai), 2) * 0.375;
	}
	sim_obj.neng_liang.nei += neng_liang_wai_to_nei;
	sim_obj.neng_liang.nei -= neng_liang_nei_to_obj;
	sim_obj.neng_liang.obj += neng_liang_nei_to_obj;
	
	// 外壁加热能量注入
	sim_obj.neng_liang.wai += sim_obj.heat.ext_duty_flt * 200 / sim_obj.heat.ext_heat_period;
	
	sim_obj.neng_liang.wai -= neng_liang_wai_to_nei;
	
	// 外壁能量逃逸
	if(sim_obj.temp.f_wai > 20.0)
	{
		if(sim_obj.b_feng_shan)
			neng_linag_wai_leave = pow((sim_obj.temp.f_wai - 20), 2) * 0.625;
		else
			neng_linag_wai_leave = pow((sim_obj.temp.f_wai - 20), 1.8) * 0.225;
	}
	else if(sim_obj.temp.f_wai < 20.0)
	{
		if(sim_obj.b_feng_shan)
			neng_linag_wai_leave = -pow((20 - sim_obj.temp.f_wai), 2) * 0.625;
		else
			neng_linag_wai_leave = -pow((20 - sim_obj.temp.f_wai), 1.8) * 0.225;
	}
	
	sim_obj.neng_liang.wai -= neng_linag_wai_leave;
	
	// 排气耗散内部能量
    if(sim_obj.press.b_air_out)
    {
		float dec;
		
		if(sim_obj.temp.f_nei > sim_obj.temp.ft)
		{
			dec = pow((sim_obj.temp.f_nei - sim_obj.temp.ft + 5), 1.8) * 6;
		
			sim_obj.neng_liang.nei -= dec;
		}
		else
		{
			float lmt;
			
			lmt = pow(5, 1.8) * 6;
			
			dec = lmt * pow(sim_obj.temp.f_nei / sim_obj.temp.ft, 2);
		}
    }	
	
	
	// 温度输出
	sim_obj.temp.f_nei = sim_obj.temp.f_nei * 0.8 + 0.2 * sim_obj.neng_liang.nei / sim_obj.neng_liang.re_rong_liang_nei;
	sim_obj.temp.f_wai = sim_obj.temp.f_wai * 0.8 + 0.2 * sim_obj.neng_liang.wai / sim_obj.neng_liang.re_rong_liang_wai;
	
	//物温滞后于气温
    sim_obj.temp.f_obj = sim_obj.temp.f_obj * 0.8 + 0.2 * sim_obj.neng_liang.obj / sim_obj.neng_liang.re_rong_liang_obj;
    
	// 排气空气比例
	if(sim_obj.press.b_air_out)
	{
		
		if(sim_obj.press.f_press > sim_obj.press.da_qi_ya + 1)
		{
			// 递减
			sim_obj.press.kong_qi_bili -= log((sim_obj.press.f_press - sim_obj.press.da_qi_ya)*0.1 + 1.01) * 0.000325;
			if(sim_obj.press.kong_qi_bili < 0.005)
				sim_obj.press.kong_qi_bili = 0.005;		
		}
		else if(sim_obj.temp.ft > sim_obj.temp.f_nei)
		{
			//递增
			sim_obj.press.kong_qi_bili += log2((sim_obj.temp.ft - sim_obj.temp.f_nei)*0.2 + 1.01) * 0.000325;
			if(sim_obj.press.kong_qi_bili > 0.99)
				sim_obj.press.kong_qi_bili = 0.99;
		}
	}
	
	// 压力
	sim_obj.press.da_qi_ya = steam_temp_to_press(sim_obj.temp.ft*10) * 0.1;	
	if(sim_obj.temp.f_nei > sim_obj.temp.ft)
	{
		float press_new;
		
		// 缓冲压力
		sim_obj.press.ft_buff *= 0.995;
		if(sim_obj.press.ft_buff < 0.1)
			sim_obj.press.ft_buff = 0.1;
		
		// 新压力
		press_new = steam_temp_to_press(sim_obj.temp.f_nei*10) * 0.1;
		press_new += (press_new - sim_obj.press.da_qi_ya + sim_obj.press.ft_buff) * sim_obj.press.kong_qi_bili;
		
		// 滞后
		sim_obj.press.f_press =sim_obj.press.f_press * 0.8 +  press_new * 0.2;
	}
	else
	{
		float press_offset = 0;
		float press_new;
		// 假定沸点-30度处起压力，全功率加热状态沸点处压力50kPa
		if(sim_obj.temp.f_nei > sim_obj.temp.ft - 30)
		{
			press_offset = 50 * sim_obj.heat.main_duty_flt / sim_obj.heat.main_heat_period;
			press_offset *= (sim_obj.temp.f_nei - (sim_obj.temp.ft -30)) / 30;
		}
		
		sim_obj.press.ft_buff = sim_obj.press.ft_buff * 0.95 + press_offset * 0.05;
		
		press_new = sim_obj.press.da_qi_ya + sim_obj.press.ft_buff;
		
		sim_obj.press.f_press = press_new * 0.2 + sim_obj.press.f_press * 0.8;
	}
	
    //压力仿真
    if(sim_obj.press.f_press > (sim_obj.press.da_qi_ya + 30))
        sim_obj.press.b_low = 0;
    else if(sim_obj.press.f_press < (sim_obj.press.da_qi_ya + 25))
        sim_obj.press.b_low = 1;
    
    if(sim_obj.press.f_press > 142.0)
        sim_obj.press.b_hith = 0;
    else if(sim_obj.press.f_press < 141.0)
        sim_obj.press.b_hith = 1;
    
    // 水位
	if(sim_obj.water.b_bu_shui)
	{
		// 补水
		sim_obj.water.f_shui_wei += 75.0f/10.0f/119.0f;
	}
	
	if(sim_obj.water.b_pai_shui && (sim_obj.press.f_press > sim_obj.press.da_qi_ya + 5))
	{
		// 排水
		sim_obj.water.f_shui_wei -= (sim_obj.press.f_press - sim_obj.press.da_qi_ya) / 20 * 0.075;
		if(sim_obj.water.f_shui_wei < 0 )
			sim_obj.water.f_shui_wei = 0;
	}
	
	if(sim_obj.water.f_shui_wei > 50)
		sim_obj.water.b_wt_low = 1;
	else
		sim_obj.water.b_wt_low = 0;
	
	if(sim_obj.water.f_shui_wei > 75)
		sim_obj.water.b_wt_high = 1;
	else
		sim_obj.water.b_wt_high = 0;
}

